package com.xuetang9.vo;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * @工能
 * @作者 杜目杰
 * @时间 2020/5/21
 * @地点 公司
 * @版本 1.0.0
 * @版权 老九学堂
 */
public class TestUtil {
    /**
     * 将来源数据对象转换成目标对象
     *
     * @param sourcesData 来源数据
     * @param targetClass 目标对象类型
     * @return 构建好的目标对象
     */
    public static Object change(Object sourcesData, Class<?> targetClass) {
        //构建结果对象
        Object resultObject;
        try {
            resultObject = targetClass.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

        //获取目标对象，拥有的方法
        Method[] targetMethod = targetClass.getMethods();
        for (Method method : targetMethod) {
            //不是set方法不执行后续逻辑
            if (!method.getName().startsWith("set")) continue;

            //提取方法的后缀名
            String suffix = method.getName().substring(3);

            //判断数据对象是否有对应的get方法
            String getFunName = "get" + suffix;
            try {
                Method sourceFun = sourcesData.getClass().getMethod(getFunName);
                //提取数据
                Object data = sourceFun.invoke(sourcesData);
                //设置数据
                method.invoke(resultObject, data);
            } catch (NoSuchMethodException e) {
                System.out.println("数据源对象没有，" + getFunName + "方法");
                //e.printStackTrace();
            } catch (Exception e) {
                System.out.println("数据源对象的数据类型与目标对象不匹配，对应方法" + getFunName);
                //e.printStackTrace();
            }
        }
        return resultObject;
        //调用数据源对象的get方法进行赋值，如果没有对应的get方法，那么跳过

//        if (o != null) {
//            Class c = o.getClass();
//            try {
////                if (c.equals(c1)) {
////                    return o;
////                }
//                Object o1 = c1.getConstructor().newInstance();
//                Field f[] = c.getDeclaredFields();
//                // 保存属性名和属性值
//                Map<String, Object> dateMap = new HashMap<>();
//                // 保存属性名
//                String fName;
//                // 保存方法名
//                String mName;
//                // 保存get方法
//                Object data;
//
//                for (int j = 0; j < f.length; j++) {
//                    // 得到属性名
//                    fName = f[j].getName();
//                    fName = fName.substring(0, 1).toUpperCase().concat(fName.substring(1));
//
//                    // 得到属性的get方法名           substring(n1,n2)截取n1到n2，n2没填就截取到最后一位  toUpperCase()转大写 toLowerCase()转小写
//                    mName = "get" + fName;
//
//                    //  得到属性值
//                    data = c.getMethod(mName).invoke(o);
//
//                    //判断是否存在set方法
//                    String setFun = "set"+ fName;
//
//
//
//
//                    /* 保存属性名和属性值 */
//                    dateMap.put(fName, data);
//                }
//                System.out.println(dateMap);
//                Field f1[] = c1.getDeclaredFields();
//                data = null;
//                // 将所有get方法得名字
//                for (int i = 0; i < f1.length; i++) {
//                    fName = f1[i].getName();
////                    if(fName == null){
////                        continue;
////                    }
//                    mName = "set" + fName.substring(0, 1).toUpperCase().concat(fName.substring(1));
//                    data = dateMap.get(fName);
//                    if (f1[i].getType().equals(data.getClass())) {
//                        c1.getDeclaredMethod(mName, f1[i].getType()).invoke(o1, data);
//                        System.out.println("o1"+o1);
//                    } else {
//                        System.out.println("属性名为" + fName + "的参数类型不匹配");
//                    }
//                }
//                return o1;
//            } catch (Exception e) {
//                System.out.println("转换失败");
//            }
//        }
    }
}
